piXoneer Development Library
XDL 3.0 for C#
NXVideoView를 활용하여 다양한 포맷의 동영상을 도시하는 기능을 구현합니다.
“다음” 버튼을 눌러 프로젝트의 이름(XDL_VideoView1)을 입력하고 [새 프로젝트] 대화상자의 “만들기” 버튼을 클릭한다. “만들기” 버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Form을 디자인할 수 있는 화면이 생성된다. 만약 아래와 같이 Form 디자인 화면이 생성되지 않으면, [솔루션 탐색기] 창에서 “Form1.cs”를 마우스 더블 클릭하여 디자인화면을 연다.
프로젝트 속성에서 빌드 탭의 구성을 Debug 또는 Release로 설정하고 플랫폼은 x64로 설정한다. 출력 경로는 기본 경로를 사용한다. (이에 대한 자세한 내용은 홈페이지의 XDL DataStructure 1.2.4 부분을 참고한다.)
[도구 상자] 창의 “일반”에서 마우스 오른쪽 버튼을 클릭하여 생성되는 팝업메뉴에서 “항목 선택” 메뉴를 선택한다. 메뉴를 선택하면 아래와 같이 [도구 상자 항목 선택] 대화상자가 나타나며, 대화상자 아래쪽에 있는 “찾아보기” 버튼을 클릭한다.
열기 대화상자에서 “C:\Pixoneer\XDL3.0\bin\NXVideo.dll” 파일을 선택한 후 “열기”를 클릭하고, [도구 상자 항목 선택] 대화상자의 “확인” 버튼을 클릭한다.
.NET Framework 구성요소 탭에 다양한 레이어와 NXVideoView가 설정된다. “확인”버튼을 클릭한다.
[도구상자] 에 NXVideoView 및 NXVideoXXX가 추가됨을 확인한다.
C#
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
}
C#
using Pixoneer.NXDL.NXVideo;
C#
XVideoIO m_VideoIO; // Video입출력에 관한 객체를 생성. XVideoIO객체는 XVideo객체를 생성한다.
XVideo m_Video; // XVideo객체는 실질적으로 비디오 스트리밍을 받아서 처리하는 객체이다.
XVideoChannel m_channel; // XVideoChannel은 보통 1개의 파일에는 1개의 스트리밍이 있지만, MPEG2TS와 같이 MultiChannel을 지원하는것도 있다.
// 결국 XVideoChannel이 스트리밍에 대한 파싱 및 도시를 위한 비디오 Frame 데이터 관리를 수행한다.
C#
public Form1()
{
InitializeComponent();
m_VideoIO = new XVideoIO(); // VideoIO를 생성
}
C#
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
// 파일 Open을 수행한다.
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "TS file(*.ts)|*.ts||";
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() != DialogResult.OK) return;
// XVideoIO객체로터 XVideo객체를 생성한다.
string strError = null;
m_Video = m_VideoIO.OpenFile(openFileDialog.FileName, "XFFMPDRIVER", out strError);
if (m_Video == null)
{
MessageBox.Show(strError);
return;
}
// XVideoView객체에 XVideo객체와 Multi Channel인 경우를 고려하여 XVideo객체 안의 Channel에 대한 인덱스를 설정한다.
int nIdxChannel = 0;
nxVideoView1.SetVideoChannel(m_Video, nIdxChannel);
// XVideo객체로부터 특정 인덱스에 해당하는 Channel을 꺼낸다.
m_channel = m_Video.GetChannel(nIdxChannel);
if (m_channel == null)
{
MessageBox.Show("Channel is not valid");
}
// Channel을 활성화하고 Play한다.
m_channel.Activate();
}
C#
private void playToolStripMenuItem_Click(object sender, EventArgs e)
{
m_channel.Play();
}
private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
{
m_channel.Pause();
}
private void resumeToolStripMenuItem_Click(object sender, EventArgs e)
{
m_channel.Resume();
}
private void stopToolStripMenuItem_Click(object sender, EventArgs e)
{
m_channel.Stop();
}
C#
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Video 종료시에 XVideoView와 XVideo와의 관계를 정리한다.
nxVideoView1.ResetVideoChannel();
if (m_Video != null)
m_Video.Close();
}
“다음” 버튼을 눌러 사용자가 원하는 경로를 선택한 다음 프로젝트 이름을 “XDL_VideoView1” 으로 입력하고 [새 프로젝트] 대화상자의 “만들기” 버튼을 클릭한다. “만들기” 버튼을 누르면 프로젝트가 기본적으로 생성되고 화면에 Window을 디자인할 수 있는 화면이 뜬다. 만약 아래와 같은 Window 창이 생성되지 않으면, [솔루션 탐색기] 창에서 MainWindow.xaml”를 마우스 더블클릭을 하여 창을 연다.
프로젝트 속성에서 빌드 탭의 구성을 Debug 또는 Release로 설정하고 플랫폼은 x64로 설정한다. 출력 경로는 기본 경로를 사용한다.(이에 대한 자세한 내용은 홈페이지의 XDL DataStructure 1.2.4 부분을 참고한다.)
MenuItem이 추가된 것을 확인한 뒤 [속성]창에서 Header에 “File”과 “Tools”를 각각 입력한다.
아래와 같은 메뉴를 얻을 수 있다.
[File] 하부에 추가적으로 메뉴를 생성하려고 한다. [File]에 오른쪽 버튼을 클릭하고 MenuItem을 추가한다. [File] 하부에 MenuItem이 생성된 것을 확인할 수 있다.
생성된 MenuItem의 [속성]창에서 Header을 “Open”으로 입력한다. MenuItem의 이름은 아래의 표를 참고하여 입력한다.
아래와 같은 메뉴가 구성되었음을 확인할 수 있다.
아래의 표를 참고하여 메뉴를 생성하도록 한다.
Control Type | Header | Name |
---|---|---|
MenuItem | _File | |
MenuItem | _Open | openFileMenuItem |
아래의 표를 참고하여 메뉴를 생성한다.
Control Type | Header | Name |
---|---|---|
MenuItem | _Tool | |
MenuItem | _Play | playToolsMenuItem |
MenuItem | _Pause | pauseToolsMenuItem |
MenuItem | _Stop | stopToolsMenuItem |
MenuItem | _Resume | resumeToolsMenuItem |
또한 XAML창이 아래와 같이 생성됨을 알 수 있다.
XAML
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Header="_File" Margin="5,5,4,5">
<MenuItem x:Name="openFileMenuItem" Header="_Open"/>
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem x:Name="playToolsMenuItem" Header="_Play"/>
<MenuItem x:Name="pauseToolsMenuItem" Header="_Pause"/>
<MenuItem x:Name="stopToolsMenuItem" Header="_Stop"/>
<MenuItem x:Name="resumeToolsMenuItem" Header="_Resume"/>
</MenuItem>
</Menu>
</Grid>
빨간색 네모를 클릭한 상태로 WindowFormsHost창의 크기를 변화시켜 두 번째 Row Grid창에 맞게 설정한다. 다음과 같은 Window 창을 얻을 수 있다.
XAML
<Grid Grid.Row="1">
<WindowsFormsHost Margin="3,0,0,3">
<nxVideo:NXVideoView x:Name="nxVideoView1">
</WindowsFormsHost>
</Grid>
C#
private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{
}
C#
using Pixoneer.NXDL.NXVideo;
C#
XVideoIO m_VideoIO; // Video 입출력에 관한 객체를 생성. XVideoIO 객체는 XVideo객체를 생성한다.
XVideo m_Video; // XVideo 객체는 실질적으로 비디오 스트리밍을 받아서 처리하는 객체이다.
XVideoChannel m_channel; // XVideoChannel은 보통 1개의 파일에는 1개의 스트리밍이 있지만, MPEG2TS와 같이 MultiChannel을 지원하는 것도 있다.
// 결국 XVideoChannel이 스트리밍에 대한 파싱 및 도시를 위한 비디오 Frame 데이터 관리를 수행한다.
C#
public MainWindow()
{
InitializeComponent();
m_VideoIO = new XVideoIO(); // VideoIO를 생성
}
C#
private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{
// 파일 Open을 수행한다.
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "TS file(*.ts)|*.ts||";
openFileDialog.RestoreDirectory = true;
Nullable<bool> result = openFileDialog.ShowDialog();
if (result != true) return;
// XVideoIO 객체로부터 XVideo 객체를 생성한다.
string strError = null;
m_Video = m_VideoIO.OpenFile(openFileDialog.FileName, "XFFMPDRIVER", out strError);
if (m_Video == null)
{
MessageBox.Show(strError);
return;
}
// XVideoView 객체에 XVideo 객체와 Muti Channel인 경우를 고려하여 XVideo 객체 안의 Channel에 대한 인덱스를 설정한다.
int nIdxChannel = 0;
nxVideoView1.SetVideoChannel(m_Video, nIdxChannel);
// XVideo객체로부터 특정 인덱스에 해당하는 Channel을 꺼낸다.
m_channel = m_Video.GetChannel(nIdxChannel);
if (m_channel == null)
{
MessageBox.Show("Channel is not valid");
}
// Channel을 활성화하고 Play한다.
m_channel.Activate();
}
C#
private void playToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
if (m_channel == null)
{
MessageBox.Show(" 재생을 위한 File을 추가 하십시오.");
}
else
{
m_channel.Play();
}
}
private void pauseToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
if (m_channel == null)
{
MessageBox.Show("재생을 위한 File을 추가 하십시오.");
}
else
{
m_channel.Pause();
}
}
private void stopToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
if (m_channel == null)
{
MessageBox.Show("재생을 위한 File을 추가 하십시오.");
}
else
{
m_channel.Stop();
}
}
private void resumeToolsMenuItem_Click(object sender, RoutedEventArgs e)
{
if (m_channel == null)
{
MessageBox.Show("재생을 위한 File을 추가 하십시오.");
}
else
{
m_channel.Resume();
}
}
C#
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// Video 종료시에 XVideoView와 XVideo와의 관계를 정리한다.
nxVideoView1.ResetVideoChannel();
if (m_Video != null)
m_Video.Close();
}